package com.ssky.bean.validator.core.checker;

import com.ssky.bean.validator.core.IValidatorContext;
import com.ssky.bean.validator.core.exception.VldException;
import org.apache.commons.lang3.StringUtils;

import java.util.HashSet;

/**
 * <li/>针对所有类型对象校验； 会先调用toString()方法得到字符串值再进行校验
 * @Author: ssky
 * @Date: 2021/07/30
 * @Description:
 */
public class NotContainsChecker<V,L,B> extends AbstractChecker<V,L,B>{

    /**
     * <li/>set
     * 使用英文封号（;）作为元素分割符
     */
    private String elems;



    private final HashSet<String> elemSet = new HashSet<>();

    private static final String SPLIT = ";";

    @Override
    void initz() throws Exception {
        if (StringUtils.isBlank(elems)) {
            throw new VldException("Rule:" + getId() + " Config Error : The \"elems\" property value not be empty !");
        }
        String[] tokens = this.elems.split(";");
        for (String str : tokens) {
            this.elemSet.add(str);
        }
    }

    /**
     * 具体规则执行器
     *
     * @param v   规则校验的当前值
     * @param l   当前值作为属性的所在对象
     * @param b   当前值所在的顶级javaBean对象
     * @param ctx 上下文（针对具体规则的实现要求，可基于接口IValidatorContext扩展）
     * @return 校验通过返回true, 不通过返回false
     */
    @Override
    public boolean process(V v, L l, B b, IValidatorContext ctx) {
        if (StringUtils.isBlank(v.toString())) {
            return true;
        }

        String vStr = null;
        if (String.class == getField().getClassType()){
            vStr = (String) v;
        }else {
            vStr = v.toString();
        }

        if (!elemSet.contains(vStr)){
            return true;
        }
        return false;
    }
}
